package C_java类库新特性.Date_TimeAPI;

import java.time.*;

/**
 * Created by zc on 2017/3/12.
 *      Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。
 * 对日期与时间的操作一直是Java程序员最痛苦的地方之一。标准的 java.util.Date以及
 * 后来的java.util.Calendar一点没有改善这种情况（可以这么说，它们一定程度上更加复杂）。
 * <p>
 *      这种情况直接导致了Joda-Time——一个可替换标准日期/时间处理且功能非常强大的Java API的诞生。
 * Java 8新的Date-Time API (JSR 310)在很大程度上受到Joda-Time的影响，并且吸取了其精髓。
 * 新的java.time包涵盖了所有处理日期，时间，日期/时间，时区，时刻（instants），过程（during）
 * 与时钟（clock）的操作。在设计新版API时，十分注重与旧版API的兼容性：不允许有任何的改变
 * （从java.util.Calendar中得到的深刻教训）。如果需要修改，会返回这个类的一个新实例。
 */
public class DateDemo {
    public static void main(String[] args) {
        /**
         * 第一个是Clock类，它通过指定一个时区，然后就可以获取到当前的时刻，日期与时间。
         * Clock可以替换System.currentTimeMillis()与TimeZone.getDefault()。
         */
        final Clock clock = Clock.systemUTC();
        System.out.println(clock.instant());// TimeZone.getDefault()
        System.out.println(clock.millis()); // System.currentTimeMillis()


        /**
         * 我们需要关注的其他类是LocaleDate与LocalTime。
         * LocaleDate只持有ISO-8601格式且无时区信息的日期部分。相应的，
         * LocaleTime只持有ISO-8601格式且无时区信息的时间部分。
         * LocaleDate与LocalTime都可以从Clock中得到。
         */
        final LocalDate date = LocalDate.now();
        final LocalDate dateFromClock = LocalDate.now(clock);
        System.out.println(date);
        System.out.println(dateFromClock);

        final LocalTime time = LocalTime.now();
        LocalTime timeFromClock = LocalTime.now(clock);
        System.out.println(time);
        System.out.println(timeFromClock);


        /**
         * LocaleDateTime把LocaleDate与LocaleTime的功能合并起来，
         * 它持有的是ISO-8601格式无时区信息的日期与时间。
         */
        final LocalDateTime localDateTime = LocalDateTime.now();
        LocalDateTime localDateTimeFromClock = LocalDateTime.now(clock);
        System.out.println(localDateTime);
        System.out.println(localDateTimeFromClock);


        /**
         * 如果你需要特定时区的日期/时间，那么ZonedDateTime是你的选择。
         * 它持有ISO-8601格式具具有时区信息的日期与时间。
         */
        final ZonedDateTime zonedDatetime = ZonedDateTime.now();
        final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now(clock);
        final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now(ZoneId.of("America/Los_Angeles"));

        System.out.println(zonedDatetime);
        System.out.println(zonedDatetimeFromClock);
        System.out.println(zonedDatetimeFromZone);


        /**
         * Duration类：在秒与纳秒级别上的一段时间。
         * Duration使计算两个日期间的不同变的十分简单。
         */
        LocalDateTime from = LocalDateTime.of(2015, Month.JANUARY, 18, 9, 0);
        LocalDateTime to = LocalDateTime.of(2017, Month.APRIL, 19, 12, 21);
        Duration duration = Duration.between(from, to);
        System.out.println(duration.getSeconds());
        System.out.println(duration.toDays());
        System.out.println(duration.toHours());


    }
}
